// https://www.lintcode.com/problem/string-to-integer-atoi/my-submissions?_from=ladder&&fromId=6

class Solution {
public:
    /**
     * @param str: A string
     * @return: An integer
     */
    int atoi(string &str) {
        int pos = 0;
        int label = 0;
        int result = 0;
        if (str.empty()) return result;
        // if (str[0] == '-' || str[0] == '+')  // "+1"
        // {
        //     if (str[0] == '-') label = -1;
        //     pos = 1;
        // } " -0 "
        
        
       
        while (pos < str.length())
        {
            if (str[pos] >= '0' && str[pos] <= '9') 
            {
                 // Input
                // Show Difference
                // "2147483648"
                // Output
                // -2147483648
                // Expected
                // 2147483647
                if (result != 0 && ((result * 10 + str[pos] - '0' ^ result) < 0)) 
                {
                    // return result > 0 ? INT_MAX : INT_MIN; 
                    return label >= 0 ? INT_MAX : INT_MIN; 
                }
                //注意判断 result != 0，注意运算符优先级
                result = result * 10 + str[pos] - '0'; //注意减'0'
            }
            else if (result == 0 && label == 0 && (str[pos] == '-' || str[pos] == '+')) 
            {
                if (str[pos] == '-') label = -1;
                else label = 1;
            }
            // else if (str[pos] == '.') break;
            // Input
            // " 15+4" //加减号只有在开头才有效！
            // Output
            // 154
            // Expected
            // 15
            
            // Input
            // Show Difference
            // "   +-1111 " //但是不能拿result==0 来判断加减号在不在开头！
            // 也不能只拿label set与否来判断，不然" 15+4"就是对的了
            // Output
            // -1111
            // Expected
            // 0
            else if (str[pos] != ' ') break;
            pos++;
        }
        
        if (label) return label * result;
        else return result;
    }
};